package com.javaee.demov2.service.impl;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.javaee.demov2.persistent.entity.User;
import com.javaee.demov2.persistent.mapper.UserMapper;
import com.javaee.demov2.service.UserService;
import com.javaee.demov2.utils.bean.PageResult;
import com.javaee.demov2.utils.bean.SysConstants;
import com.javaee.demov2.utils.enums.UserStatusEnum;
import com.javaee.demov2.utils.response.ServiceException;
import com.javaee.demov2.web.dto.user.UserAddDto;
import com.javaee.demov2.web.dto.user.UserQueryDto;
import com.javaee.demov2.web.dto.user.UserUpdateDto;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


/**
 * UserService类实现类
 */

@Transactional
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {


    /**
     * 添加用户
     */
    @Override
    public void add(UserAddDto userAddDto) {
        User user = new User();
        // 逻辑判断
        // 用户名不能重复
        if (this.isExistUsername(userAddDto.getUsername())) {
            throw new ServiceException("用户名已经存在");
        }
        // email地址不能重复
        if (this.isExistEmail(userAddDto.getEmail())) {
            throw new ServiceException("Email地址已经存在");
        }
        // 手机号不能重复
        if (this.isExistMobilePhone(userAddDto.getMobilePhone())) {
            throw new ServiceException("手机号码已经存在");
        }
        // 将dto数据复制到user实体类
        BeanUtils.copyProperties(userAddDto, user);
        // 设置默认状态和密码
        user.setStatus(UserStatusEnum.USER_ACTIVE.getCode());
        user.setPassword(SysConstants.DEFAULT_PASSWORD);
        super.save(user);
    }

    // 判断用户名是否存在
    @Override
    public boolean isExistUsername(String username) {
        return super.lambdaQuery().eq(User::getUsername, username).count() > 0;
    }

    // 判断手机号是否重复
    @Override
    public boolean isExistMobilePhone(String mobilePhone) {
        return super.lambdaQuery().eq(User::getMobilePhone, mobilePhone).count() > 0;
    }

    // 判断email是否重复
    @Override
    public boolean isExistEmail(String email) {
        return super.lambdaQuery().eq(User::getEmail, email).count() > 0;
    }

    /**
     * 复杂条件查询
     */
    @Override
    public PageResult<User> query(UserQueryDto queryDto) {
        // 创建分页对象
        Page page = queryDto.getPage();

        // 分页查询
        Page<User> result = super.lambdaQuery()
                .like(StringUtils.isNotBlank(queryDto.getUsername()), User::getUsername, queryDto.getUsername())
                .like(StringUtils.isNotBlank(queryDto.getEmail()), User::getEmail, queryDto.getEmail())
                .eq(queryDto.getStatus() != null, User::getStatus, queryDto.getStatus())
                .like(StringUtils.isNotBlank(queryDto.getMobilePhone()), User::getMobilePhone, queryDto
                        .getMobilePhone()).page(page);

        //将分页查询结果转换为PageResult的形式
        return PageResult.fromPage(result);
    }

    // 根据用户名查询用户
    @Override
    public User findByUsername(String username) {
        return super.lambdaQuery().eq(User::getUsername, username).one();
    }


    /**
     * 更新用户信息
     */
    @Override
    public void update(UserUpdateDto updateDto) {
        User user = new User();
        // 将dto转换为user实体类
        BeanUtils.copyProperties(updateDto, user);
        super.updateById(user);
    }


    // @Override
    // public PageInfo page(UserFindDto userFindDto) {
    //     PageHelper.startPage(userFindDto.getCurrentPage(), userFindDto.getPageSize());
    //     PageHelper.orderBy("created_time desc");
    //     //baseMapper即调用了UserMapper
    //     return  new PageInfo<User>(baseMapper.pageQuery(userFindDto));
    // }
    //
    // @Override
    // public User findByUsernameAndPwd(LoginDto loginDto) {
    //     System.out.println(loginDto.getUsername()+";"+loginDto.getPassword());
    //     return  this.lambdaQuery().eq(User::getStatus, loginDto.getUsername())
    //             .eq(User::getPassword, loginDto.getPassword()).one();
    // }
    //
    // @Override
    // public UserVo getUserVoById(Long userId) {
    //     UserVo userVo = new UserVo();
    //     BeanUtils.copyProperties(this.getById(userId), userVo);
    //     //获取用户对应的角色列表
    //     List<Role> roleList = roleMapper.findRolesByUserId(userId);
    //     userVo.setRoleList(roleList);
    //     return userVo;
    // }
    //
    // @Override
    // public List<Role> findRolesByUserId(Long userId) {
    //     return  roleMapper.findRolesByUserId(userId);
    // }
}
